package model.arbolBSharp;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import model.registro.RegistroHoja;


public class ConversorBytesHoja extends ConversorBytes{
	
	private Hoja hoja;
	private ConversorBytesRegistroHoja empRegHoja = new ConversorBytesRegistroHoja();
	
	public Hoja getHoja() {
		return hoja;
	}

	public void setHoja(Hoja datoHoja) {
		this.hoja = datoHoja;
	}

	
	public void convertirAObjetos(InputStream i) throws IOException {
		if (i==null)
			throw new NullPointerException();
		
		DataInputStream input = new DataInputStream(i);
		
		//Nivel
		int nivel = input.readInt();
		if (nivel != 0)
			throw new IOException("No es un nodo hoja");
		
		//Posicion
		int posicion = input.readInt();
		
		//Puntero al siguiente
		Integer punteroSiguiente = input.readInt();
		if(punteroSiguiente==0)
			punteroSiguiente=null;
		
		//Cantidad de registros
		int cantidadRegistros = input.readInt();	
		if (cantidadRegistros==0)
			throw new IOException("Error al descomprimir el nodo");
		
		//Terminos
		empRegHoja.setCantidadAConvertir(cantidadRegistros);
		empRegHoja.convertirAObjetos(i);
		List<RegistroHoja> listaRegs = empRegHoja.getListaRegistros();
		
		//Offsets
		int[] offset = new int[cantidadRegistros];
		for(int j=0; j<cantidadRegistros; j++){
			offset[j] = input.readInt();			
		}
		
		this.hoja = new Hoja(listaRegs, posicion, punteroSiguiente);
	}

	
	public void convertirABytes(OutputStream o) throws IOException {
		if(o == null)
			throw new NullPointerException("output stream");
		
		if(hoja==null)
			throw new NullPointerException("hoja");
				
		if(hoja.getPosicionEnArchivo()==null)
			throw new NullPointerException("posicion en archivo");
		
		if(hoja.getListaRegistroHoja()==null)
			throw new NullPointerException("lista terminos");
		
		if (hoja.getListaRegistroHoja().size()<=0)
			throw new IOException("La hoja debe tener al menos un termino"); 
		
		DataOutputStream out = new DataOutputStream(o);
		//Nivel
		out.writeInt(0);
				
		//Posicion
		out.writeInt(hoja.getPosicionEnArchivo());
				
		//Puntero al siguiente
		if(hoja.getPunteroASiguiente()==null){
			out.writeInt(0);						
		} else {
			out.writeInt(hoja.getPunteroASiguiente());
		}
		
		//Cantidad items
		int cantidadRegistros = hoja.getListaRegistroHoja().size();
		out.writeInt(cantidadRegistros);
		
		List<RegistroHoja> listaRegistrosHoja = new ArrayList<RegistroHoja>(cantidadRegistros);
		int[] offset = new int[cantidadRegistros];
		
		for(int i=0; i<cantidadRegistros; i++){
			RegistroHoja r =  hoja.getListaRegistroHoja().get(i);
			listaRegistrosHoja.add(r);
			offset[i] = r.getOffset();			
		}
		
		//Registros
		empRegHoja.setListaRegistros(listaRegistrosHoja);
		empRegHoja.convertirABytes(o);
					
		//offsets
		for(int i=0; i<offset.length; i++){
			out.writeInt(offset[i]);
		}
	}

}
